/*!
 * \file WtStraDtSel.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader 数据选股策略头文件
 * 
 * \details 该文件定义了WtStraDtSel类，实现基于数据技术指标的选股策略，提供：
 *          
 *          核心选股算法：
 *          - 多品种并行分析：同时分析股票池中的所有标的
 *          - 技术指标筛选：基于K1、K2系数和历史天数的量化指标
 *          - 动态调仓机制：根据市场变化实时调整持仓组合
 *          - 风险控制：通过多品种分散投资降低单一风险
 *          
 *          策略特性：
 *          - 数据驱动：完全基于历史数据和技术指标
 *          - 量化选股：使用数学模型筛选优质标的
 *          - 多市场适应：支持股票和期货市场
 *          - 实时更新：根据最新数据动态调整选股结果
 *          
 *          技术实现：
 *          - 高效计算：优化的指标计算算法
 *          - 内存管理：合理的数据缓存和释放机制
 *          - 并发处理：支持多品种并行分析
 *          - 可配置性：灵活的参数配置系统
 *          
 *          应用场景：
 *          - 股票池管理：从大量股票中筛选投资标的
 *          - 量化投资：构建基于数据的投资组合
 *          - 风险管理：通过分散投资控制风险
 *          - 择时决策：结合技术指标进行买卖时机选择
 */

#pragma once
#include "../Includes/SelStrategyDefs.h"

#include <unordered_set>

USING_NS_WTP;

/*!
 * \class WtStraDtSel
 * \brief 数据选股策略实现
 * 
 * \details 该类实现了SelStrategy接口，提供基于技术数据的选股策略框架：
 *          
 *          核心功能：
 *          - 多品种管理：同时跟踪和分析多个交易标的
 *          - 技术指标计算：基于历史数据计算选股指标
 *          - 动态筛选：实时根据市场数据调整选股结果
 *          - 组合优化：构建最优的投资组合配置
 *          
 *          算法特点：
 *          - K1/K2系数：控制选股敏感度的关键参数
 *          - 历史天数：影响技术指标计算窗口的重要参数
 *          - 周期管理：支持不同时间周期的数据分析
 *          - 品种筛选：动态维护候选投资标的集合
 *          
 *          性能优化：
 *          - 批量处理：一次性处理多个品种提高效率
 *          - 缓存机制：避免重复计算提高响应速度
 *          - 增量更新：只处理变化的数据减少计算量
 *          - 内存优化：合理管理内存使用避免泄漏
 * 
 * \note 该策略适用于需要从多个标的中选择投资对象的场景
 * \see SelStrategy, ISelStraCtx
 */
class WtStraDtSel : public SelStrategy
{
public:
	/*!
	 * \brief 构造函数
	 * \param id 策略实例唯一标识符
	 */
	WtStraDtSel(const char* id);
	
	/*!
	 * \brief 析构函数
	 */
	~WtStraDtSel();

public:
	/*!
	 * \brief 获取策略名称
	 * \return 策略名称字符串
	 */
	virtual const char* getName() override;

	/*!
	 * \brief 获取策略工厂名称
	 * \return 工厂名称字符串
	 */
	virtual const char* getFactName() override;

	/*!
	 * \brief 初始化策略参数
	 * \param cfg 配置参数对象
	 * \return 初始化成功返回true，失败返回false
	 * 
	 * \details 从配置文件中读取选股策略参数：
	 *          - k1/k2: 技术指标计算系数
	 *          - days: 历史数据天数
	 *          - period: 数据周期
	 *          - count: K线数量
	 *          - codes: 候选品种列表
	 */
	virtual bool init(WTSVariant* cfg) override;

	/*!
	 * \brief 策略初始化事件
	 * \param ctx 策略上下文
	 * 
	 * \details 策略启动时调用，执行初始化操作：
	 *          - 订阅候选品种数据
	 *          - 初始化计算引擎
	 *          - 预加载历史数据
	 */
	virtual void on_init(ISelStraCtx* ctx) override;

	/*!
	 * \brief 策略调度事件处理
	 * \param ctx 策略上下文
	 * \param uDate 当前日期
	 * \param uTime 当前时间
	 * 
	 * \details 定时调度执行选股逻辑：
	 *          - 批量分析所有候选品种
	 *          - 计算技术指标和选股评分
	 *          - 生成选股结果和调仓建议
	 *          - 执行组合调整操作
	 */
	virtual void on_schedule(ISelStraCtx* ctx, uint32_t uDate, uint32_t uTime) override;

	/*!
	 * \brief Tick数据事件处理
	 * \param ctx 策略上下文
	 * \param stdCode 标准合约代码
	 * \param newTick 新的Tick数据
	 * 
	 * \details 处理实时Tick数据更新，可用于实时监控和快速响应
	 */
	virtual void on_tick(ISelStraCtx* ctx, const char* stdCode, WTSTickData* newTick) override;

	/*!
	 * \brief K线数据事件处理
	 * \param ctx 策略上下文
	 * \param stdCode 标准合约代码
	 * \param period K线周期
	 * \param newBar 新的K线数据
	 * 
	 * \details 处理K线更新事件，用于技术指标计算和信号生成
	 */
	virtual void on_bar(ISelStraCtx* ctx, const char* stdCode, const char* period, WTSBarStruct* newBar) override;

private:
	// 技术指标参数
	double		_k1;				/*!< 技术指标系数1，控制选股敏感度 */
	double		_k2;				/*!< 技术指标系数2，控制风险控制强度 */
	uint32_t	_days;				/*!< 历史数据天数，影响指标计算窗口 */

	// 数据配置参数
	std::string _period;			/*!< 数据周期（如"d1", "m5"等） */
	uint32_t	_count;				/*!< K线数据数量，历史数据获取长度 */

	bool		_isstk;				/*!< 是否为股票市场模式 */

	// 候选品种集合
	std::unordered_set<std::string> _codes;	/*!< 候选交易品种代码集合，用于选股分析 */
};

